Spring ORM-এর সাহায্যে ডেটাবেস অপারেশন সহজ হলেও বড় ডেটাসেট থেকে ডেটা রিট্রিভ করা বেশ চ্যালেঞ্জ হতে পারে। Pagination এবং Sorting এই চ্যালেঞ্জ মোকাবিলা করার কার্যকর সমাধান। Spring ORM সাধারণত Hibernate বা JPA-এর মাধ্যমে Pagination এবং Sorting সহজতর করে।
Pagination হলো বড় ডেটাসেটকে ছোট ছোট অংশে ভাগ করে নির্দিষ্ট পরিমাণ ডেটা প্রদর্শনের পদ্ধতি। উদাহরণস্বরূপ, একটি ওয়েব পেজে একবারে ১০টি রেকর্ড দেখানোর প্রয়োজন হলে Pagination ব্যবহার করা হয়।
Sorting হলো ডেটাকে নির্দিষ্ট কলামের উপর ভিত্তি করে ক্রমানুসারে (Ascending বা Descending) সাজানোর পদ্ধতি। উদাহরণস্বরূপ, একটি ডেটাবেসে price
কলামের ডেটা ছোট থেকে বড় বা বড় থেকে ছোট সাজানোর জন্য Sorting ব্যবহার করা হয়।
JPA-র Pageable
এবং Sort
ইন্টারফেস Spring Data JPA-তে Pagination এবং Sorting সহজ করে তোলে।
// Pagination এবং Sorting কনফিগার
Pageable pageable = PageRequest.of(pageNumber, pageSize, Sort.by("name").ascending());
// ডেটা রিট্রিভ
Page<MyEntity> page = myEntityRepository.findAll(pageable);
// পেজের ডেটা এবং তথ্য
List<MyEntity> entities = page.getContent();
long totalElements = page.getTotalElements();
int totalPages = page.getTotalPages();
Hibernate-এ Pagination সাধারণত Query বা Criteria API ব্যবহার করে পরিচালিত হয়।
Query query = session.createQuery("FROM MyEntity");
query.setFirstResult((pageNumber - 1) * pageSize);
query.setMaxResults(pageSize);
List<MyEntity> entities = query.list();
Criteria criteria = session.createCriteria(MyEntity.class);
criteria.setFirstResult((pageNumber - 1) * pageSize);
criteria.setMaxResults(pageSize);
List<MyEntity> entities = criteria.list();
Spring Data JPA Pagination এবং Sorting সহজ করার জন্য রেডিমেড সমাধান দেয়।
public interface MyEntityRepository extends PagingAndSortingRepository<MyEntity, Long> {
}
Page<MyEntity> page = myEntityRepository.findAll(PageRequest.of(pageNumber, pageSize, Sort.by("name").ascending()));
Spring ORM-এর Pagination এবং Sorting বড় ডেটাসেটের ডেটা ম্যানেজমেন্ট এবং কার্যকর উপস্থাপনার জন্য অপরিহার্য। Hibernate এবং JPA উভয়েই এই বৈশিষ্ট্য সহজে প্রয়োগ করার পদ্ধতি সরবরাহ করে।
ডেটাবেস থেকে বড় পরিমাণে ডেটা রিট্রিভ করার সময় সিস্টেমের কার্যক্ষমতা বজায় রাখতে Pagination এবং Sorting গুরুত্বপূর্ণ ভূমিকা পালন করে। স্প্রিং ORM (Spring Data JPA) এই দুটি ফিচার সহজেই ইমপ্লিমেন্ট করার জন্য বিল্ট-ইন সাপোর্ট প্রদান করে।
Pagination একটি প্রক্রিয়া যেখানে ডেটাবেস থেকে ডেটা আংশিকভাবে (পেজ আকারে) রিট্রিভ করা হয়। এটি বড় ডেটাসেট পরিচালনা করার জন্য ব্যবহৃত হয়।
Pagination দুটি মূল উপাদান দ্বারা নির্ধারিত হয়:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Service;
@Service
public class EmployeeService {
@Autowired
private EmployeeRepository employeeRepository;
public Page<Employee> getPaginatedEmployees(int pageNumber, int pageSize) {
return employeeRepository.findAll(PageRequest.of(pageNumber, pageSize));
}
}
ব্যাখ্যা:
Page<Employee>
ডেটা এবং মেটাডেটা (যেমন মোট পৃষ্ঠা সংখ্যা, রেকর্ড সংখ্যা) প্রদান করে।Sorting একটি প্রক্রিয়া যেখানে ডেটাকে নির্দিষ্ট একটি বা একাধিক ফিল্ডের উপর ভিত্তি করে ক্রমবদ্ধ করা হয়। এটি ডেটাকে ব্যবহারকারী বা অ্যাপ্লিকেশনের জন্য আরও উপযোগী করে তোলে।
Sorting এর দুটি মূল দিক:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
@Service
public class EmployeeService {
@Autowired
private EmployeeRepository employeeRepository;
public List<Employee> getSortedEmployees(String sortBy) {
return employeeRepository.findAll(Sort.by(sortBy));
}
}
ব্যাখ্যা:
স্প্রিং ORM-এ Pagination এবং Sorting একসাথে সহজেই ব্যবহার করা যায়।
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
@Service
public class EmployeeService {
@Autowired
private EmployeeRepository employeeRepository;
public Page<Employee> getPaginatedAndSortedEmployees(int pageNumber, int pageSize, String sortBy) {
return employeeRepository.findAll(PageRequest.of(pageNumber, pageSize, Sort.by(sortBy)));
}
}
ব্যাখ্যা:
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface EmployeeRepository extends JpaRepository<Employee, Integer> {
}
এই ইন্টারফেসটি JpaRepository এক্সটেন্ড করার মাধ্যমে Pagination এবং Sorting এর জন্য প্রয়োজনীয় সমস্ত মেথড প্রদান করে।
স্প্রিং ORM-এ Pagination এবং Sorting বড় ডেটাসেটের কার্যকর ব্যবস্থাপনার জন্য অত্যন্ত গুরুত্বপূর্ণ। এগুলোর সাহায্যে বড় ডেটা সহজে পরিচালনা করা যায়, কার্যক্ষমতা বাড়ে এবং ব্যবহারকারীদের জন্য ডেটা উপস্থাপন আরও অর্থবহ হয়।
Spring Data JPA ডাটাবেস থেকে ডেটা রিট্রিভ করার জন্য পেজিনেশন এবং সোর্টিং সহজতর করে। Spring Data JPA এর PagingAndSortingRepository ইন্টারফেস ব্যবহার করে এই ফিচারগুলো সহজে ইমপ্লিমেন্ট করা যায়।
PagingAndSortingRepository ইন্টারফেসটি Spring Data JPA এর একটি উপাদান যা JpaRepository ইন্টারফেসের মতোই কাজ করে। তবে এটি ডেটা Pagination এবং Sorting এর জন্য অতিরিক্ত মেথড প্রদান করে।
মূলত এটি দুটি গুরুত্বপূর্ণ ফিচার সরবরাহ করে:
pom.xml
ফাইলে ডিপেনডেন্সি যোগ করুন:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
@Entity
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private Double price;
// Getters and Setters
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
}
import org.springframework.data.repository.PagingAndSortingRepository;
public interface ProductRepository extends PagingAndSortingRepository<Product, Long> {
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
@Service
public class ProductService {
@Autowired
private ProductRepository productRepository;
public Page<Product> getProductsWithPagination(int page, int size) {
Pageable pageable = PageRequest.of(page, size);
return productRepository.findAll(pageable);
}
public Page<Product> getProductsWithSorting(int page, int size, String sortBy) {
Pageable pageable = PageRequest.of(page, size, Sort.by(sortBy));
return productRepository.findAll(pageable);
}
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/products")
public class ProductController {
@Autowired
private ProductService productService;
@GetMapping
public Page<Product> getProducts(@RequestParam int page,
@RequestParam int size,
@RequestParam(required = false) String sortBy) {
if (sortBy != null) {
return productService.getProductsWithSorting(page, size, sortBy);
}
return productService.getProductsWithPagination(page, size);
}
}
application.properties
ফাইলটি কনফিগার করুন:
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
GET /products?page=0&size=5
GET /products?page=0&size=5&sortBy=price
PagingAndSortingRepository Spring Data JPA এর একটি কার্যকর ফিচার যা সহজেই পেজিনেশন এবং সোর্টিং প্রদান করে। এর মাধ্যমে ডাটাবেস থেকে ডেটা রিট্রিভ করার কার্যকারিতা বৃদ্ধি পায় এবং কোড আরও সংক্ষিপ্ত হয়। ডেভেলপমেন্টে সময় বাঁচানোর জন্য এটি একটি দুর্দান্ত টুল।
Pagination এবং Sorting এমন দুটি গুরুত্বপূর্ণ ফিচার যা বড় ডাটাবেজ ডেটা সেট পরিচালনা করতে ব্যবহৃত হয়। Pagination ডেটাকে ছোট ছোট অংশে ভাগ করে প্রদর্শন করে, এবং Sorting ডেটা সাজানোর জন্য ব্যবহৃত হয়। Spring Data JPA এর মাধ্যমে এগুলো সহজেই বাস্তবায়ন করা যায়।
Spring Boot ব্যবহার করে Pagination এবং Sorting ইমপ্লিমেন্ট করার জন্য নিম্নলিখিত স্টেপগুলো অনুসরণ করুন।
pom.xml
ডিপেন্ডেন্সিSpring Boot এবং JPA এর ডিপেন্ডেন্সি যোগ করুন।
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
package com.example.demo.entity;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
@Entity
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private double price;
// Getters and Setters
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
}
Spring Data JPA এর মাধ্যমে PagingAndSortingRepository
অথবা JpaRepository
ব্যবহার করা যায়।
package com.example.demo.repository;
import com.example.demo.entity.Product;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface ProductRepository extends JpaRepository<Product, Long> {
}
Pagination এবং Sorting অপারেশন সার্ভিস লেয়ারে পরিচালনা করুন।
package com.example.demo.service;
import com.example.demo.entity.Product;
import com.example.demo.repository.ProductRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
@Service
public class ProductService {
@Autowired
private ProductRepository productRepository;
public Page<Product> getProducts(int page, int size, String sortBy, String direction) {
Sort sort = direction.equalsIgnoreCase("asc") ? Sort.by(sortBy).ascending() : Sort.by(sortBy).descending();
Pageable pageable = PageRequest.of(page, size, sort);
return productRepository.findAll(pageable);
}
}
Pagination এবং Sorting এর জন্য REST API তৈরি করুন।
package com.example.demo.controller;
import com.example.demo.entity.Product;
import com.example.demo.service.ProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ProductController {
@Autowired
private ProductService productService;
@GetMapping("/products")
public Page<Product> getProducts(
@RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "10") int size,
@RequestParam(defaultValue = "name") String sortBy,
@RequestParam(defaultValue = "asc") String direction
) {
return productService.getProducts(page, size, sortBy, direction);
}
}
Spring Boot এর CommandLineRunner
ব্যবহার করে কিছু টেস্ট ডেটা ইনসার্ট করুন।
package com.example.demo;
import com.example.demo.entity.Product;
import com.example.demo.repository.ProductRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
@Component
public class DataLoader implements CommandLineRunner {
@Autowired
private ProductRepository productRepository;
@Override
public void run(String... args) throws Exception {
productRepository.save(new Product("Laptop", 800.00));
productRepository.save(new Product("Smartphone", 500.00));
productRepository.save(new Product("Tablet", 300.00));
productRepository.save(new Product("Smartwatch", 150.00));
}
}
URL:http://localhost:8080/products?page=0&size=2
Output:
{
"content": [
{
"id": 1,
"name": "Laptop",
"price": 800.0
},
{
"id": 2,
"name": "Smartphone",
"price": 500.0
}
],
"pageable": {
"pageNumber": 0,
"pageSize": 2,
...
},
...
}
URL:http://localhost:8080/products?page=0&size=10&sortBy=price&direction=desc
Output:
{
"content": [
{
"id": 1,
"name": "Laptop",
"price": 800.0
},
{
"id": 2,
"name": "Smartphone",
"price": 500.0
},
...
]
}
Spring ORM এবং JPA-র সাহায্যে Pagination এবং Sorting দ্রুত এবং সহজে ইমপ্লিমেন্ট করা যায়। Pageable
এবং Sort
ক্লাস ব্যবহার করে ডেটাকে ছোট অংশে ভাগ করা এবং নির্দিষ্ট ক্রমে সাজানো সম্ভব। এই পদ্ধতি বড় ডেটাসেট পরিচালনার জন্য খুবই কার্যকর।
Read more